iT邦幫忙

2024 iThome 鐵人賽

DAY 5
0
Modern Web

關於我在30天內,寫了一個紀錄我大學生活的網站系列 第 5

Day 5 | CloudFlare Workers 路由設定

  • 分享至 

  • xImage
  •  

今天我們來聊聊 CloudFlare Workers 的路由設定。這個東西其實蠻重要的,因為它可以幫我們處理不同的 HTTP 請求,讓我們的 Worker 變得更有條理。

先來看看我們的程式碼吧!這次我們要介紹的是一個叫做 Router 的類別,還有一些處理 CORS 的函數。以下是code:

    import { handleCORS, corsHeaders } from './corsHandler.js';

    class Router {
        constructor() {
            this.routes = new Map();
        }

        get(path, handler) {
            this.addRoute('GET', path, handler);
        }

        post(path, handler) {
            this.addRoute('POST', path, handler);
        }

        options(path, handler) {
            this.addRoute('OPTIONS', path, handler);
        }

        addRoute(method, path, handler) {
            if (!this.routes.has(method)) {
                this.routes.set(method, new Map());
            }
            this.routes.get(method).set(path, handler);
        }

        async handle(request, env) {
            const method = request.method;
            const url = new URL(request.url);
            const path = url.pathname;

            // Handle CORS preflight requests
            if (method === 'OPTIONS') {
                return handleCORS(request);
            }

            const routeMap = this.routes.get(method);
            if (routeMap && routeMap.has(path)) {
                const handler = routeMap.get(path);
                return handler(request, env);
            }

            return new Response('Not Found', { status: 404, headers: corsHeaders(request) });
        }
    }
    export function corsHeaders(request) {
      const headers = {
        'Access-Control-Allow-Origin': '*', //這邊要改成來源域名
        'Access-Control-Allow-Methods': 'POST, GET, OPTIONS',
        'Access-Control-Allow-Headers': 'Content-Type, X-Requested-With, Authorization',
        'Access-Control-Allow-Credentials': 'true',
      };

      const origin = request.headers.get('Origin');
      if (origin) {
        headers['Access-Control-Allow-Origin'] = origin;
      }

      return headers;
    }

    export function handleCORS(request) {
      if (request.method === 'OPTIONS') {
        return new Response(null, {
          status: 204,
          headers: corsHeaders(request)
        });
      }
      
      return null;
    }

首先,我們有一個 Router 類別。這個類別是幹嘛的呢?它就像是一個交通警察,負責指揮不同的 HTTP 請求該去哪裡。

我們可以用 getpostoptions 這些方法來設定不同的路由。比如說,如果我們想要處理 GET 請求,就可以這樣寫:

router.get('/hello', (request) => new Response('你好啊!'));

這樣一來,當有人訪問 /hello 這個路徑的時候,就會得到「你好啊!」這個回應。

再來看看 handle 方法。這個方法是整個 Router 的核心,它負責處理所有進來的請求。它會先檢查是不是 CORS 的預檢請求(OPTIONS 方法),如果是的話就用 handleCORS 來處理。如果不是,它就會找找看有沒有對應的處理函數,有的話就執行,沒有的話就回傳 404 錯誤。

最後,我們還有兩個處理 CORS 的函數:corsHeadershandleCORS。CORS 是啥?它是「跨來源資源共用」的縮寫,用來讓不同網域的網頁可以安全地互相存取資源。這兩個函數就是在幫我們處理這些跨域請求的問題。

總結一下,這個 Router 類別讓我們可以很方便地設定不同的路由,而且還幫我們處理了 CORS 的問題。
如果我有任何錯誤,歡迎在留言區一起討論!


上一篇
Day 4 | 邁出實作的第一步
系列文
關於我在30天內,寫了一個紀錄我大學生活的網站5
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言